package nioclient;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;

/**
 * 请求客户端
 * 一个请求客户端连上服务器端后，往服务器端发送 ”Hello non-blocking IO reactor Pattern” 字符串。
 * 在 non blocking IO socket 编程中，客户端的 SocketChannel 也使用 Selector ，并注册感兴趣的事件。
 * 本例中注册 OP_CONNECT 事件，然后确保 SocketChannel 是连接上服务器端的，再向服务器端发送一个字符串后，请求客户端的任务完成。
 *  在 main 函数中，模拟了 50 个并发的客户端。
 *  
 * @author Xinz
 *
 */
public class NIOClient extends Thread{
	
	private int port = 8888;
	
	private int id;
	
	public NIOClient(int id) {
		this.id = id;
	}
	@Override
	public void run() {
		Charset utf8 = Charset.forName("utf-8");
		try {
			SocketChannel channel = SocketChannel.open(new InetSocketAddress(port));
			channel.configureBlocking(false);
			Selector selector = Selector.open();
			channel.register(selector, SelectionKey.OP_CONNECT);
			if(!channel.isConnected())
				channel.finishConnect();
			channel.write(utf8.encode("Hello non-blocking IO reactor pattern..." + id));
			channel.close();
		}
		catch(IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String args[]) {
		for(int i = 0; i< 50; ++i) {
			new NIOClient(i).start();
		}
	}
}
